package br.ufrgs.seguranca.cryptography;

import java.math.BigInteger;

/**
 * @author otaviokz
 *
 */
public class DiffieHellmanMultiplicative {
	
	/**
	 * @param args
	 */
	private BigInteger n;	
	private BigInteger g;
	private BigInteger X;
	private BigInteger Y;
	private BigInteger twoFiveSix = new BigInteger("256");

		
	public DiffieHellmanMultiplicative(BigInteger _n, BigInteger _g, BigInteger _X, BigInteger _Y) {
		
		this.n = _n;
		this.g = _g;
		this.X = _X;
		this.Y = _Y;
	}
	
	public byte[] getAESKey() 
	{	
		BigInteger invG = g.modInverse(n);
		System.out.println(invG.toString());
		BigInteger K = ((invG.multiply(X)).multiply(Y)).mod(n);		
		System.out.println(K.toString());
		
		// Essa parte é uma cópia provavelmente mal sucedida do código que está no próprio
		// texto do desafio.
		byte[] k = K.toByteArray();
		byte AESKey[] = new byte[16];
		for (int i = 0; i < 16; i++)
		{
			// No texto diz pra fazer AESKey[i] = K mod 256, mas como converter o resultado para um byte? 
			// O resultado possui vários bytes differentes, como saber qual usar?
			
			BigInteger x = K.mod(twoFiveSix);
			//System.out.println(i + ": " + x.toString());
			String z = x.toString();
			int y = Integer.parseInt(z);
			
			AESKey[i] = (byte)y;
			K = K.divide(twoFiveSix);
		}
		
		for(int i = 0; i < 16; i++)
		{
			System.out.println(AESKey[i]);
		}
	
		return AESKey;
	}
	
}
